"""
推理工厂函数

这个模块提供了create_inference工厂函数，用于根据模型文件类型自动创建合适的推理实例。
支持PyTorch模型(.pth)和ONNX模型(.onnx)。
"""

from pathlib import Path
from typing import List, Optional
from devdeploy.inference.base_inference import BaseInference
from devdeploy.inference.torch_inference import TorchInference
from devdeploy.inference.onnx_inference import OnnxInference

# todo 是否支持多线程访问
def create_inference(model_path: str, device: str = 'cpu', class_names: Optional[List[str]] = None) -> BaseInference:
    """
    创建推理实例的工厂函数
    
    根据模型文件的后缀自动选择合适的推理后端：
    - .pth -> TorchInference (PyTorch推理)
    - .onnx -> OnnxInference (ONNX推理)
    
    Args:
        model_path (str): 模型文件路径
        device (str): 推理设备，默认为'cpu'
        class_names (Optional[List[str]]): 类别名称列表
        
    Returns:
        BaseInference: 推理实例
        
    Raises:
        ValueError: 当模型文件格式不支持时抛出
        
    Example:
        >>> # 自动选择PyTorch推理
        >>> infer = create_inference('model.pth', device='cuda')
        >>> 
        >>> # 自动选择ONNX推理
        >>> infer = create_inference('model.onnx', device='cpu')
        >>> 
        >>> # 进行推理
        >>> result = infer.infer_single('image.jpg')
    """
    ext = Path(model_path).suffix.lower()
    if ext == '.pth':
        return TorchInference(model_path, device, class_names)
    elif ext == '.onnx':
        return OnnxInference(model_path, device, class_names)
    else:
        raise ValueError(f'不支持的模型格式: {ext}。支持的格式: .pth (PyTorch), .onnx (ONNX)') 